﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Win32;
using Puzzler.Plugin.Interface;
using Puzzler.Project;
using Puzzler.Utils;
using Puzzler.Word.Properties;
using Office = Microsoft.Office.Core;
using Size = System.Windows.Size;

// TODO: Führen Sie diese Schritte aus, um das Element auf dem Menüband (XML) zu aktivieren:

// 1: Kopieren Sie folgenden Codeblock in die ThisAddin-, ThisWorkbook- oder ThisDocument-Klasse.

//  protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
//  {
//      return new PuzzlerRibbon();
//  }

// 2. Erstellen Sie Rückrufmethoden im Abschnitt "Menübandrückrufe" dieser Klasse, um Benutzeraktionen
//    zu behandeln, z.B. das Klicken auf eine Schaltfläche. Hinweis: Wenn Sie dieses Menüband aus dem Menüband-Designer exportiert haben,
//    verschieben Sie den Code aus den Ereignishandlern in die Rückrufmethoden, und ändern Sie den Code für die Verwendung mit dem
//    Programmmodell für die Menübanderweiterung (RibbonX).

// 3. Weisen Sie den Steuerelementtags in der Menüband-XML-Datei Attribute zu, um die entsprechenden Rückrufmethoden im Code anzugeben.  

// Weitere Informationen erhalten Sie in der Menüband-XML-Dokumentation in der Hilfe zu Visual Studio-Tools für Office.


namespace Puzzler.Word
{
    [ComVisible(true)]
    public class PuzzlerRibbon : Office.IRibbonExtensibility
    {
        public event EventHandler ProjectLinkClick;
        public event EventHandler AddPuzzleSolutionClick;
        public event EventHandler AddPuzzleGameClick;

        public bool IsEnabled
        {
            get { return isEnabled; }
            set
            {
                isEnabled = value;
                ribbon.Invalidate();
            }
        }

        private Office.IRibbonUI ribbon;
        private bool isEnabled;

        public PuzzlerRibbon()
        {
            isEnabled = true;
        }

        public void Invalidate()
        {
            ribbon.Invalidate();
        }

        #region IRibbonExtensibility-Member

        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("Puzzler.Word.PuzzlerRibbon.xml");
        }

        #endregion

        #region Menübandrückrufe
        //Erstellen Sie hier Rückrufmethoden. Weitere Informationen über das Hinzufügen von Rückrufmethoden erhalten Sie, indem Sie das Menüband-XML-Element im Projektmappen-Explorer markieren und dann F1 drücken.

        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
        }

        #region Click

        public void linkProjectFile_Click(Office.IRibbonControl ribbonControl)
        {
            OnProjectLinkClick();
            ribbon.Invalidate();
        }

        public void btnAddPuzzleGame_onAction(Office.IRibbonControl ribbonControl)
        {
            OnAddPuzzleGameClick();
            ribbon.Invalidate();
        }

        public void btnAddPuzzleSolution_onAction(Office.IRibbonControl ribbonControl)
        {
            OnAddPuzzleSolutionClick();
            ribbon.Invalidate();
        }

        #endregion

        #region Images

        public Bitmap linkProjectFile_GetImage(Office.IRibbonControl ribbonControl)
        {
            return Resources.Link.ToBitmap();
        }

        public Bitmap btnAddPuzzleGame_getImage(Office.IRibbonControl ribbonControl)
        {
            return Resources.puzzle_game.ToBitmap();
        }

        public Bitmap btnAddPuzzleSolution_getImage(Office.IRibbonControl ribbonControl)
        {
            return Resources.puzzle_solution.ToBitmap();
        }

        #endregion

        #region Enabled / Disabled

        public bool btnPuzzle_getEnabled(Office.IRibbonControl ribbonControl)
        {
            return PuzzlerProjectService.ProjectInfo != null && IsEnabled;
        }

        public bool ribbon_getEnabled(Office.IRibbonControl ribbonControl)
        {
            return IsEnabled;
        }

        #endregion

        #endregion

        #region Hilfsprogramme

        private static string GetResourceText(string resourceName)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            string[] resourceNames = asm.GetManifestResourceNames();
            for (int i = 0; i < resourceNames.Length; ++i)
            {
                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                {
                    using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                    {
                        if (resourceReader != null)
                        {
                            return resourceReader.ReadToEnd();
                        }
                    }
                }
            }
            return null;
        }

        #endregion

        protected void OnProjectLinkClick()
        {
            if (ProjectLinkClick != null)
            {
                ProjectLinkClick(this, new EventArgs());
            }
        }

        protected void OnAddPuzzleSolutionClick()
        {
            if (AddPuzzleSolutionClick != null)
            {
                AddPuzzleSolutionClick(this, new EventArgs());
            }
        }

        protected void OnAddPuzzleGameClick()
        {
            if (AddPuzzleGameClick != null)
            {
                AddPuzzleGameClick(this, new EventArgs());
            }
        }
    }
}
